import { _decorator, Component, EventTouch, Input, input, Node, UITransform, Vec2 } from 'cc'
const { ccclass, property } = _decorator

@ccclass('JoyStickManager')
export class JoyStickManager extends Component {
    input: Vec2 = Vec2.ZERO

    private body: Node
    private stick: Node
    private defaultPos: Vec2
    private radius: number

    onLoad() {
        this.body = this.node.getChildByName('Body')
        this.stick = this.body.getChildByName('Stick')
        this.defaultPos = new Vec2(this.body.position.x, this.body.position.y)
        this.radius = this.body.getComponent(UITransform).contentSize.x / 2
        input.on(Input.EventType.TOUCH_START, this.onTouchStart, this)
        input.on(Input.EventType.TOUCH_MOVE, this.onTouchMove, this)
        input.on(Input.EventType.TOUCH_END, this.onTouchEnd, this)
    }

    onDestroy() {
        input.off(Input.EventType.TOUCH_START, this.onTouchStart, this)
        input.off(Input.EventType.TOUCH_MOVE, this.onTouchMove, this)
        input.off(Input.EventType.TOUCH_END, this.onTouchEnd, this)
    }

    onTouchStart(e: EventTouch) {
        const touchPos = e.getUILocation()
        this.body.setPosition(touchPos.x, touchPos.y)
        // console.log(e.getUILocation())
    }

    onTouchMove(e: EventTouch) {
        const touchPos = e.getUILocation()
        // Stick 节点在 Body 节点下，所以坐标需要转换成相对 Body 的坐标，并且限制在半径范围内
        const stickPos = new Vec2(touchPos.x - this.body.position.x, touchPos.y - this.body.position.y)
        if (stickPos.length() > this.radius) {
            stickPos.multiplyScalar(this.radius / stickPos.length())
        }
        this.stick.setPosition(stickPos.x, stickPos.y)
        
        this.input = stickPos.clone().normalize()
        // console.log(`JoyStick Input: ${this.input.x}, ${this.input.y}`)
    }

    onTouchEnd() {
        this.body.setPosition(this.defaultPos.x, this.defaultPos.y)
        this.stick.setPosition(0, 0)
        this.input = Vec2.ZERO
    }
}

